Это маленький шаг, в котором я просто решил показать как можно обойтись без операций начального сдвига и поворотов.
В дополнительной библиотеке OpenGL glu32.lib существует функция gluLookAt, которая принимает 9! аргументов.
Первые 3 - координаты позиции глаза налюдателя, вторые 3 - координаты точки, распологающейся в центре экрана, третьи 3 - направление вектора, задающего поворот сцены.
Для демонстрации этой функции я, как обычно, сделал простой пример. Опять сделал пункт меню, который будет вызвать диалог для установки всех 9-ти параметров этой функции. Сделал сам диалог и установил соответствующие переменные для полей ввода. В классе C...View сделал массив GLfloat m_Par[9]. Сюда в обработчике пункта меню заношу преобразованные в числовой вид значения полей ввода из диалога.
В функции OnDraw(...) просто подставляем эти значения как аргументы функции:
void CExampleView::OnDraw(CDC* pDC)
{
CRect clientRect;
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GetClientRect(&clientRect);
glViewport(0, 0, clientRect.right, clientRect.bottom);
glClearColor (0.5, 0.5, 0.75, 1.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 0.0, 0.5);
glLoadIdentity();
gluPerspective(70.0, clientRect.right / clientRect.bottom, 2.0, 10.0);
gluLookAt (m_Par[0], m_Par[1], m_Par[2], m_Par[3],
m_Par[4], m_Par[5], m_Par[6], m_Par[7], m_Par[8]);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
DrawCube();
SwapBuffers(pDC->m_hDC);
}
Обработчик меню выглядит так:
void CExampleView::OnViewParam()
{
// TODO: Add your command handler code here
CParDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_Par[0] = (float)atof(dlg.m_Eyes_X);
m_Par[1] = (float)atof(dlg.m_Eyes_Y);
m_Par[2] = (float)atof(dlg.m_Eyes_Z);
m_Par[3] = (float)atof(dlg.m_Point_X);
m_Par[4] = (float)atof(dlg.m_Point_Y);
m_Par[5] = (float)atof(dlg.m_Point_Z);
m_Par[6] = (float)atof(dlg.m_Vector_X);
m_Par[7] = (float)atof(dlg.m_Vector_Y);
m_Par[8] = (float)atof(dlg.m_Vector_Z);
}
InvalidateRect(NULL, FALSE);
}
На этом все сложности закончились. Поэкспериментируйте с цифрами, можно добится интересных результатов ;) Не забудьте включить заголовочный файл диалога в файл ...View.cpp